#!/bin/bash
#
# Copyright (c) 2006 Mellanox Technologies. All rights reserved.
#
# This Software is licensed under one of the following licenses:
#
# 1) under the terms of the "Common Public License 1.0" a copy of which is
#    available from the Open Source Initiative, see
#    http://www.opensource.org/licenses/cpl.php.
#
# 2) under the terms of the "The BSD License" a copy of which is
#    available from the Open Source Initiative, see
#    http://www.opensource.org/licenses/bsd-license.php.
#
# 3) under the terms of the "GNU General Public License (GPL) Version 2" a
#    copy of which is available from the Open Source Initiative, see
#    http://www.opensource.org/licenses/gpl-license.php.
#
# Licensee has the right to choose one of the above licenses.
#
# Redistributions of source code must retain the above copyright
# notice and one of the license notices.
#
# Redistributions in binary form must reproduce both the above copyright
# notice, one of the license notices in the documentation
# and/or other materials provided with the distribution.
#
#  $Id: configure 9097 2006-08-24 06:39:09Z vlad $
#

usage()
{
cat << EOF
\`configure' configures variables for kernel modules compilation and executes 
configure for userspace applications

Usage:  `basename $0` [options]

    --prefix=PREFIX  for userspace components []
    --build_root=BUILD_ROOT  root directory to build RPM packages
    --kernel-version=VERSION  make for this kernel [$(uname -r)]
    --modules-dir=DIR  modules directory [/lib/modules/$(uname -r)]
    --kernel-sources=DIR  make for this kernel [/lib/modules/$(uname -r)/build]
    --with-quilt[=FILE]  path to quilt [$(/usr/bin/which quilt  2> /dev/null)]
    --without-quilt  use patch and not quilt [no]
    --with-patchdir=DIR  path to the patches directory []
    --without-patch  don't apply any patch [no]
    --with-userspace-fixes apply fixes (patches) to userspace [yes]
    --without-userspace-fixes don't apply patches to userspace

    --with-kernel-fixes apply fixes (patches) to kernel sources [yes]
    --without-kernel-fixes don't apply patches to kernel sources

    --with-backport-patches apply backport patches [yes]
    --without-backport-patches don't apply backport patches

    --with-hpage-patch apply huge pages patch [yes]
    --without-hpage-patch don't apply huge pages patch

    --without-userlevel  don't run configure on user level libraries [no]
    
    --libdir=DIR  object code libraries []

    --with-libibverbs include libibverbs package [yes]
    --without-libibverbs include libibverbs package [no]
    
    --with-libmthca include libmthca package [yes]
    --without-libmthca include libmthca package [no]
    
    --with-libipathverbs include libipathverbs package [yes]
    --without-libipathverbs include libipathverbs package [no]
    
    --with-libehca include libehca package [yes]
    --without-libehca include libehca package [no]
    
    --with-libibcm  include CM package [no]
    --without-libibcm  don't include CM package [yes]
    
    --with-libsdp  include SDP package [no]
    --without-libsdp  don't include SDP package [yes]
    
    --with-librdmacm  include librdmacm package [no]
    --without-librdmacm  don't include librdmacm package [yes]
    
    --with-dapl  include DAPL package [no]
    --without-dapl  don't include DAPL package [yes]
    
    --with-management-libs  include management lib packages (libibcommon, libibmad, libibumad) [no]
    --without-management-libs  don't include management lib packages (libibcommon, libibmad, libibumad) [yes]

    --with-libibcommon      include libibcommon package [no]
    --without-libibcommon   don't include libibcommon package [yes]
    --with-libibumad        include libibumad package [no]
    --without-libibumad     don't include libibumad package [yes]
    --with-libibmad         include libibmad package [no]
    --without-libibmad      don't include libibmad package [yes]

    --with-opensm  include OSM package [no]
    --without-opensm  don't include OSM package [yes]
    
    --with-openib-diags  include diagnostic utilities [no]
    --without-openib-diags  don't include diagnostic utilities [yes]
    
    --with-mpi  include MPI package [no]
    --without-mpi  don't include MPI package [yes]
    
    --with-perftest  include perftest package [no]
    --without-perftest  don't include perftest package [yes]
    
    --with-srptools  include srptools package [no]
    --without-srptools  don't include srptools package [yes]
    
    --with-ipoibtools  include ipoibtools package [no]
    --without-ipoibtools  don't include ipoibtools package [yes]
    
    --with-tvflash  include tvflash package [no]
    --without-tvflash  don't include tvflash package [yes]
    
    --with-mstflint  include mstflint package [no]
    --without-mstflint  don't include mstflint package [yes]

    --with-memtrack  enable momory tracking [no]
    --without-memtrack disable memory tracking [yes]


    Kernel modules configuration:

    --with-core-mod    make CONFIG_INFINIBAND=m [no]
    --without-core-mod   [yes]

    --with-ipoib-mod    make CONFIG_INFINIBAND_IPOIB=m [no]
    --without-ipoib-mod   [yes]

    --with-ipoib_debug-mod    make CONFIG_INFINIBAND_IPOIB_DEBUG=y [yes]
    --without-ipoib_debug-mod    [no]

    --with-ipoib_debug_data-mod    make CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y [no]
    --without-ipoib_debug_data-mod    [yes]

    --with-sdp-mod    make CONFIG_INFINIBAND_SDP=m [no]
    --without-sdp-mod    [yes]

    --with-sdp_debug-mod    make CONFIG_INFINIBAND_SDP_DEBUG=y [yes]
    --without-sdp_debug-mod   [no]

    --with-sdp_debug_data-mod    make CONFIG_INFINIBAND_SDP_DEBUG_DATA=y [no]
    --without-sdp_debug_data-mod    [yes]

    --with-srp-mod    make CONFIG_INFINIBAND_SRP=m [no]
    --without-srp-mod    [yes]

    --with-user_mad-mod    make CONFIG_INFINIBAND_USER_MAD=m [no]
    --without-user_mad-mod    [yes]

    --with-user_access-mod    make CONFIG_INFINIBAND_USER_ACCESS=m [no]
    --without-user_access-mod    [yes]

    --with-addr_trans-mod    make CONFIG_INFINIBAND_ADDR_TRANS=y [no]
    --without-addr_trans-mod    [yes]
    
    --with-mthca-mod    make CONFIG_INFINIBAND_MTHCA=m [no]
    --without-mthca-mod    [yes]
    
    --with-mthca_debug-mod    make CONFIG_INFINIBAND_MTHCA_DEBUG=y [yes]
    --without-mthca_debug-mod    [no]

    --with-ipath_inf-mod    make CONFIG_INFINIBAND_IPATH=m [no]
    --without-ipath_inf-mod    [yes]
    
    --with-iser-mod    make CONFIG_INFINIBAND_ISER=m [no]
    --without-iser-mod    [yes]

    --with-ehca-mod    make CONFIG_INFINIBAND_EHCA=m [no]
    --without-ehca-mod    [yes]

    --with-rds-mod    make CONFIG_INFINIBAND_RDS=m [no]
    --without-rds-mod   [no]

    --with-rds_debug-mod    make CONFIG_INFINIBAND_RDS_DEBUG=y [no]
    --without-rds_debug-mod    [yes]

    --with-madeye-mod   make CONFIG_INFINIBAND_MADEYE=m [no]
    --without-madeye-mod    [yes]

    --help - print out options


EOF

#   Currently not supported options
#    --with-sdp-zcopy  make CONFIG_INFINIBAND_SDP_SEND_ZCOPY=y CONFIG_INFINIBAND_SDP_RECV_ZCOPY=y [no]
#    --without-sdp-zcopy [yes]
}

# Execute command w/ echo and exit if it fail
ex()
{
        echo "$@"
        if ! "$@"; then
                printf "\nFailed executing $@\n\n"
                exit 1
        fi
}

# Apply backport patches according to kernel version
apply_backport_patches()
{

    if [ ! -d ${CWD}/kernel_patches/backport ]; then
        echo "${CWD}/kernel_patches/backport directory does not exist"
        return 0
    fi

    case ${KVERSION} in
        2.6.5-7.*)
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.5-7.244 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.5-7.244/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                    ex $QUILT import ${patch}
                                    ex $QUILT push patches/${patch##*/}
                                else
                                    if ! (patch -p1 -l < ${patch} ); then
                                        echo "Failed to apply patch: ${patch}"
                                        exit 1
                                    fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.9-34*)
                printf "\nApplying patches for ${KVERSION} kernel (RHAS4 Update 3):\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.9_U3 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.9_U3/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.9-42*)
                printf "\nApplying patches for ${KVERSION} kernel (RHAS4 Update 4):\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.9_U4 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.9_U4/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.9*)
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.9 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.9/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.10*)
                #printf "\nApplying patches for ${KVERSION} kernel:\n"
        ;;
        2.6.11*)
            if ( echo ${KVERSION} | grep FC4 > /dev/null 2>&1 );then
                printf "\nApplying patches for ${KVERSION} kernel (Fedora Core 4):\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.11_FC4 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.11_FC4/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
            else
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.11 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.11/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
            fi
        ;;
        2.6.12*)
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.12 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.12/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.13-1[6-9]*|2.6.13-15.*)
                printf "\nApplying patches for ${KVERSION} kernel: Updated SuSE 10.0\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.13_suse10_0_u ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.13_suse10_0_u/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.13*)
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.13 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.13/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.14*)
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.14 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.14/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.15*)
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.15 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.15/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.16*)
            if (grep "SUSE Linux Enterprise Server 10" /etc/issue > /dev/null 2>&1); then
                printf "\nApplying patches for ${KVERSION} kernel (SLES 10):\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.16_sles10 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.16_sles10/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
            else
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.16 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.16/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
            fi
        ;;
        2.6.17*)
                printf "\nApplying patches for ${KVERSION} kernel:\n"
                if [ -d ${CWD}/kernel_patches/backport/2.6.17 ]; then
                        for patch in ${CWD}/kernel_patches/backport/2.6.17/*
                        do
                            if [ -e  ${patch} ]; then
                                printf "\t${patch}\n"
                                if [ "${WITH_QUILT}" == "yes" ]; then
                                        ex $QUILT import ${patch}
                                        ex $QUILT push patches/${patch##*/}
                                else
                                        if ! (patch -p1 -l < ${patch} ); then
                                            echo "Failed to apply patch: ${patch}"
                                            exit 1
                                        fi
                                fi
                            fi    
                        done
                fi
        ;;
        2.6.1[8-9]*)
        ;;
        *)
                printf "\n No Patches found for ${KVERSION} kernel\n"
        ;;
    esac

}

apply_userspace_fixes()
{

    if [ ! -d ${CWD}/user_patches/fixes ]; then
        echo "${CWD}/user_patches/fixes directory does not exist"
        return 0
    fi
    for patch in ${CWD}/user_patches/fixes/*
    do
        if [ -e  ${patch} ]; then
            printf "\t${patch}\n"
            if [ "${WITH_QUILT}" == "yes" ]; then
                    ex $QUILT import ${patch}
                    ex $QUILT push patches/${patch##*/}
            else
                    if ! (patch -p1 -l < ${patch} ); then
                        echo "Failed to apply patch: ${patch}"
                        exit 1
                    fi
            fi
        fi   
    done
}

apply_kernel_fixes()
{

    if [ ! -d ${CWD}/kernel_patches/fixes ]; then
        echo "${CWD}/kernel_patches/fixes directory does not exist"
        return 0
    fi
    for patch in ${CWD}/kernel_patches/fixes/*
    do
        if [ -e  ${patch} ]; then
            printf "\t${patch}\n"
            if [ "${WITH_QUILT}" == "yes" ]; then
                    ex $QUILT import ${patch}
                    ex $QUILT push patches/${patch##*/}
            else
                    if ! (patch -p1 -l < ${patch} ); then
                        echo "Failed to apply patch: ${patch}"
                        exit 1
                    fi
            fi
        fi   
    done
}

# Apply patches
apply_patch()
{
    ex mkdir -p ${CWD}/patches
    quiltrc=${CWD}/patches/quiltrc
    ex touch ${quiltrc}

cat << EOF >> ${quiltrc}
QUILT_DIFF_OPTS='-x .svn -p --ignore-matching-lines=\$Id'
QUILT_PATCH_OPTS='-l'
EOF

        QUILT="${QUILT} --quiltrc ${quiltrc}"

        if [ -n "${PATCH_DIR}" ]; then
                # Apply user's patches
                for patch in ${PATCH_DIR}/*
                do
                    if [ -e  ${patch} ]; then
                        printf "\t${patch}\n"
                        if [ "${WITH_QUILT}" == "yes" ]; then
                                ex $QUILT import ${patch}
                                ex $QUILT push patches/${patch##*/}
                        else
                                if ! (patch -p1 -l < ${patch} ); then
                                    echo "Failed to apply patch: ${patch}"
                                    exit 1
                                fi
                        fi
                    fi
                done

        else
                # Apply userspace fixes
                if [ "X${WITH_USERSPACE_FIXES}" == "Xyes" ]; then
                    apply_userspace_fixes
                fi

                # Apply kernel fixes
                if [ "X${WITH_KERNEL_FIXES}" == "Xyes" ]; then
		    # Voltaire patch is ZZZ_dma_map_sg.diff conflicting with hpages.patch
		    #there for we mov it to other location and operate it later
		    mv ${CWD}/kernel_patches/fixes/ZZZ_dma_map_sg.diff ${CWD}/kernel_patches/hpage_patches/
                    apply_kernel_fixes
                fi

                # Apply backport patches
                if [ "X${WITH_BACKPORT_PATCHES}" == "Xyes" ]; then
                    apply_backport_patches
                fi

        # Apply huge pages patch
        if [ -d ${CWD}/kernel_patches/hpage_patches ]; then
            if [ "X${WITH_HPAGE_PATCH}" == "Xyes" ]; then
                # Apply hpages.patch
                patch=${CWD}/kernel_patches/hpage_patches/hpages.patch
                printf "\t${patch}\n"
                if [ "${WITH_QUILT}" == "yes" ]; then
                        ex $QUILT import ${patch}
                        ex $QUILT push patches/${patch##*/}
		        # Now we have to activate ZZZ_dma_map_sg.diff 
			patch=${CWD}/kernel_patches/hpage_patches/ZZZ_dma_map_sg.diff
                        ex $QUILT import ${patch}
                        ex $QUILT push patches/${patch##*/}
                else
                        if ! (patch -p1 -l < ${patch} ); then
                            echo "Failed to apply patch: ${patch}"
                            exit 1
                        fi
			patch=${CWD}/kernel_patches/hpage_patches/ZZZ_dma_map_sg.diff
                        if ! (patch -p1 -l < ${patch} ); then
                            echo "Failed to apply patch: ${patch}"
                            exit 1
                        fi
                fi
            else
                # Apply hpage_crash_backport.patch on kernels <= 2.6.15
                case ${KVERSION} in
                    2.6.[1-9][6-9]*)
                    ;;
                    *)
                        patch=${CWD}/kernel_patches/hpage_patches/hpage_crash_backport.patch
                                    printf "\t${patch}\n"
                                    if [ "${WITH_QUILT}" == "yes" ]; then
                                            ex $QUILT import ${patch}
                                            ex $QUILT push patches/${patch##*/}
                                    else
                                            if ! (patch -p1 -l < ${patch} ); then
                                                echo "Failed to apply patch: ${patch}"
                                                exit 1
                                            fi
                                    fi
                    ;;
                esac
            fi
        fi

                if [ "${WITH_MEMTRACK}" == "yes" ]; then
                    patch=${CWD}/kernel_patches/memtrack/memtrack.patch
                    if [ -e ${patch} ]; then
                        if [ "${WITH_QUILT}" == "yes" ]; then
                                ex $QUILT import ${patch}
                                ex $QUILT push patches/${patch##*/}
                        else
                                if ! ( patch -p1 -l < ${patch} ); then
                                    echo "Failed to apply patch: ${patch}"
                                    exit 1
                                fi
                        fi
                    fi
                fi
        fi
}

# Compare 2 kernel versions
check_kerver()
{
        local kver=$1
        local min_kver=$2
        shift 2

        kver_a=$(echo -n ${kver} | cut -d '.' -f 1)
        kver_b=$(echo -n ${kver} | cut -d '.' -f 2)
        kver_c=$(echo -n ${kver} | cut -d '.' -f 3 | cut -d '-' -f 1 | tr -d [:alpha:][:punct:])

        min_kver_a=$(echo -n ${min_kver} | cut -d '.' -f 1)
        min_kver_b=$(echo -n ${min_kver} | cut -d '.' -f 2)
        min_kver_c=$(echo -n ${min_kver} | cut -d '.' -f 3 | cut -d '-' -f 1 | tr -d [:alpha:][:punct:])

        if [ ${kver_a} -lt ${min_kver_a} ] ||
                [[ ${kver_a} -eq ${min_kver_a} && ${kver_b} -lt ${min_kver_b} ]] ||
                [[ ${kver_a} -eq ${min_kver_a} && ${kver_b} -eq ${min_kver_b} && ${kver_c} -lt ${min_kver_c} ]]; then
                return 1
        fi
        
        return 0   
}

main()
{
        # Parsing parameters
        while [ ! -z "$1" ]
        do
                case $1 in
                        -prefix | --prefix | --prefi | --pref | --pre | --pr | --p | -p)
                                shift
                                prefix=$1
                                PREFIX="--prefix ${prefix}"
                        ;;
                        -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=* | -p=*)
                                prefix=`expr "x$1" : 'x[^=]*=\(.*\)'`
                                PREFIX="--prefix ${prefix}"
                        ;;
                        -libdir | --libdir)
                                shift
                                libdir=$1
                                LIBDIR="--libdir ${libdir}"
                        ;;
                        -libdir=* | --libdir=*)
                                libdir=`expr "x$1" : 'x[^=]*=\(.*\)'`
                                LIBDIR="--libdir ${libdir}"
                        ;;
                        -kernel-version | --kernel-version | --kern-ver | --ker-ver)
                                shift
                                KVERSION=$1
                        ;;
                        -kernel-version=* | --kernel-version=* | --kern-ver=* | --ker-ver=*)
                                KVERSION=`expr "x$1" : 'x[^=]*=\(.*\)'`
                        ;;
                        -modules-dir | --modules-dir | --mod-dir)
                                shift
                                MODULES_DIR=$1
                        ;;
                        -modules-dir=* | --modules-dir=* | --mod-dir=*)
                                MODULES_DIR=`expr "x$1" : 'x[^=]*=\(.*\)'`
                        ;;
                        -kernel-sources | --kernel-sources | --kernel-src | --kern-src | --ker-src)
                                shift
                                KSRC=$1
                        ;;
                        -kernel-sources=* | --kernel-sources=* | --kernel-src=* | --kern-src=* | --ker-src=*)
                                KSRC=`expr "x$1" : 'x[^=]*=\(.*\)'`
                        ;;
                        -with-quilt | --with-quilt)
                                WITH_QUILT="yes"
                                if [ ! -z "$2" ] && [ "`echo -n $2 | cut -c 1`" != '-' ]; then
                                        shift
                                        QUILT=$1
                                        if [ ! -x ${QUILT} ]; then
                                                echo "${QUILT} does not exist"
                                                exit 1
                                        fi
                                fi
                        ;;
                        -with-quilt=* | --with-quilt=*)
                                WITH_QUILT="yes"
                                QUILT=`expr "x$1" : 'x[^=]*=\(.*\)'`
                                if [ ! -x ${QUILT} ]; then
                                        echo "${QUILT} does not exist"
                                        exit 1
                                fi
                        ;;
                        --without-quilt)
                                WITH_QUILT="no"
                        ;;
                        -with-patchdir | --with-patchdir)
                                shift
                                WITH_PATCH="yes"
                                PATCH_DIR=$1
                        ;;
                        -with-patchdir=* | --with-patchdir=*)
                                PATCH_DIR=`expr "x$1" : 'x[^=]*=\(.*\)'`
                                WITH_PATCH="yes"
                        ;;
                        --without-patch)
                                WITH_PATCH="no"
                        ;;
                        --with-userspace-fixes)
                                WITH_USERSPACE_FIXES="yes"
                                WITH_PATCH="yes"
                        ;;
                        --without-userspace-fixes)
                                WITH_USERSPACE_FIXES="no"
                        ;;
                        --with-kernel-fixes)
                                WITH_KERNEL_FIXES="yes"
                                WITH_PATCH="yes"
                        ;;
                        --without-kernel-fixes)
                                WITH_KERNEL_FIXES="no"
                        ;;
                        --with-hpage-patch)
                                WITH_HPAGE_PATCH="yes"
                                WITH_PATCH="yes"
                        ;;
                        --without-hpage-patch)
                                WITH_HPAGE_PATCH="no"
                        ;;
                        --with-backport-patches)
                                WITH_BACKPORT_PATCHES="yes"
                                WITH_PATCH="yes"
                        ;;
                        --without-backport-patches)
                                WITH_BACKPORT_PATCHES="no"
                        ;;
                        --with-userlevel)
                                WITH_USERLEVEL="yes"
                        ;;
                        --without-userlevel)
                                WITH_USERLEVEL="no"
                        ;;
                        --with-libibverbs)
                                WITH_IBVERBS="yes"
                        ;;
                        --without-libibverbs)
                                WITH_IBVERBS="no"
                        ;;
                        --with-libmthca)
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                        ;;
                        --without-libmthca)
                                WITH_MTHCA="no"
                        ;;
                        --with-libipathverbs)
                                WITH_IPATHVERBS="yes"
                                WITH_IBVERBS="yes"
                        ;;
                        --without-libipathverbs)
                                WITH_IPATHVERBS="no"
                        ;;
                        --with-libehca)
                                WITH_EHCA="yes"
                                WITH_IBVERBS="yes"
                        ;;
                        --without-libehca)
                                WITH_EHCA="no"
                        ;;
                        --with-libibcm)
                                WITH_CM="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                        ;;
                        --without-libibcm)
                                WITH_CM="no"
                        ;;
                        --with-libsdp)
                                WITH_SDP="yes"
                        ;;
                        --without-libsdp)
                                WITH_SDP="no"
                        ;;
                        --with-librdmacm)
                                WITH_RDMACM="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                        ;;
                        --without-librdmacm)
                                WITH_RDMACM="no"
                        ;;
                        --with-dapl)
                                WITH_DAPL="yes"
                                WITH_RDMACM="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                        ;;
                        --without-dapl)
                                WITH_DAPL="no"
                        ;;
                        --with-management-libs)
                                WITH_MANAGEMENT_LIBS="yes"
                                WITH_IBCOMMON="yes"
                                WITH_IBUMAD="yes"
                                WITH_IBMAD="yes"
                        ;;
                        --without-management-libs)
                                WITH_MANAGEMENT_LIBS="no"
                        ;;
                        --with-libibcommon)
                                WITH_IBCOMMON="yes"
                                WITH_MANAGEMENT_LIBS="yes"
                        ;;
                        --without-libibcommon)
                                WITH_IBCOMMON="no"
                        ;;
                        --with-libibumad)
                                WITH_IBUMAD="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                                WITH_IBCOMMON="yes"
                                WITH_MANAGEMENT_LIBS="yes"
                        ;;
                        --without-libibumad)
                                WITH_IBUMAD="no"
                        ;;
                        --with-libibmad)
                                WITH_IBMAD="yes"
                                WITH_IBUMAD="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                                WITH_IBCOMMON="yes"
                                WITH_MANAGEMENT_LIBS="yes"
                        ;;
                        --without-libibmad)
                                WITH_IBMAD="no"
                        ;;
                        --with-opensm)
                                WITH_OSM="yes"
                                WITH_IBUMAD="yes"
                                WITH_IBCOMMON="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                                WITH_MANAGEMENT_LIBS="yes"
                        ;;
                        --without-opensm)
                                WITH_OSM="no"
                        ;;
                        --with-openib-diags)
                                WITH_DIAGS="yes"
                                WITH_OSM="yes"
                                WITH_IBMAD="yes"
                                WITH_IBUMAD="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                                WITH_IBCOMMON="yes"
                                WITH_MANAGEMENT_LIBS="yes"
                        ;;
                        --without-openib-diags)
                                WITH_DIAGS="no"
                        ;;
                       --with-mpi)
                                WITH_MPI="yes"
                        ;;
                        --without-mpi)
                                WITH_MPI="no"
                        ;;
                        --with-perftest)
                                WITH_PERFTEST="yes"
                                WITH_MTHCA="yes"
                                WITH_IBVERBS="yes"
                                WITH_RDMACM="yes"
                        ;;
                        --without-perftest)
                                WITH_PERFTEST="no"
                        ;;
                        --with-srptools)
                                WITH_SRPTOOLS="yes"
                                WITH_IBVERBS="yes"
                                WITH_IBCOMMON="yes"
                                WITH_IBUMAD="yes"
                        ;;
                        --without-srptools)
                                WITH_SRPTOOLS="no"
                        ;;
                        --with-ipoibtools)
                                WITH_IPOIBTOOLS="yes"
                        ;;
                        --without-ipoibtools)
                                WITH_IPOIBTOOLS="no"
                        ;;
                        --with-tvflash)
                                WITH_TVFLASH="yes"
                        ;;
                        --without-tvflash)
                                WITH_TVFLASH="no"
                        ;;
                        --with-mstflint)
                                WITH_MSTFLINT="yes"
                        ;;
                        --without-mstflint)
                                WITH_MSTFLINT="no"
                        ;;
                        --with-memtrack)
                            WITH_MEMTRACK="yes"
                        ;;
                        --without-memtrack)
                            WITH_MEMTRACK="no"
                        ;;
                        --with-core-mod)
                            CONFIG_INFINIBAND="m"
                        ;;
                        --without-core-mod)
                            CONFIG_INFINIBAND=
                        ;;
                        --with-ipoib-mod)
                            CONFIG_INFINIBAND_IPOIB="m"
                            CONFIG_INFINIBAND_IPOIB_DEBUG="y"
                        ;;    
                        --without-ipoib-mod)
                            CONFIG_INFINIBAND_IPOIB=
                        ;;
                        --with-ipoib_debug-mod)
                            CONFIG_INFINIBAND_IPOIB_DEBUG="y"
                        ;;
                        --without-ipoib_debug-mod)
                            CONFIG_INFINIBAND_IPOIB_DEBUG=
                        ;;
                        --with-ipoib_debug_data-mod)
                            CONFIG_INFINIBAND_IPOIB_DEBUG_DATA="y"
                        ;;
                        --without-ipoib_debug_data-mod)
                            CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=
                        ;;
                        --with-sdp-mod)
                            CONFIG_INFINIBAND_SDP="m"
                            CONFIG_INFINIBAND_SDP_DEBUG="y"
                        ;;
                        --without-sdp-mod)
                            CONFIG_INFINIBAND_SDP=
                        ;;
                        --with-sdp-zcopy)
                            CONFIG_INFINIBAND_SDP_SEND_ZCOPY="y"
                            CONFIG_INFINIBAND_SDP_RECV_ZCOPY="y"
                        ;;
                        --without-sdp-zcopy)
                            CONFIG_INFINIBAND_SDP_SEND_ZCOPY=
                            CONFIG_INFINIBAND_SDP_RECV_ZCOPY=
                        ;;
                        --with-sdp_debug-mod)
                            CONFIG_INFINIBAND_SDP_DEBUG="y"
                        ;;
                        --without-sdp_debug-mod)
                            CONFIG_INFINIBAND_SDP_DEBUG=
                        ;;
                        --with-sdp_debug_data-mod)
                            CONFIG_INFINIBAND_SDP_DEBUG_DATA="y"
                        ;;
                        --without-sdp_debug_data-mod)
                            CONFIG_INFINIBAND_SDP_DEBUG_DATA=
                        ;;
                        --with-srp-mod)
                            CONFIG_INFINIBAND_SRP="m"
                        ;;
                        --without-srp-mod)
                            CONFIG_INFINIBAND_SRP=
                        ;;
                        --with-user_mad-mod)
                            CONFIG_INFINIBAND_USER_MAD="m"
                        ;;
                        --without-user_mad-mod)
                            CONFIG_INFINIBAND_USER_MAD=
                        ;;
                        --with-user_access-mod)
                            CONFIG_INFINIBAND_USER_ACCESS="m"
                        ;;
                        --without-user_access-mod)
                            CONFIG_INFINIBAND_USER_ACCESS=
                        ;;
                        --with-addr_trans-mod)
                            CONFIG_INFINIBAND_ADDR_TRANS=y
                        ;;
                        --without-addr_trans-mod)
                            CONFIG_INFINIBAND_ADDR_TRANS=
                        ;;
                        --with-mthca-mod)
                            CONFIG_INFINIBAND_MTHCA="m"
                            CONFIG_INFINIBAND_MTHCA_DEBUG="y"
                        ;;
                        --without-mthca-mod)
                            CONFIG_INFINIBAND_MTHCA=
                        ;;
                        --with-mthca_debug-mod)
                            CONFIG_INFINIBAND_MTHCA_DEBUG="y"
                        ;;
                        --without-mthca_debug-mod)
                            CONFIG_INFINIBAND_MTHCA_DEBUG=
                        ;;
                        --with-ipath_inf-mod)
                            CONFIG_INFINIBAND_IPATH="m"
                        ;;
                        --without-ipath_inf-mod)
                            CONFIG_INFINIBAND_IPATH=
                        ;;
                        --with-iser-mod)
                            CONFIG_INFINIBAND_ISER="m"
                        ;;
                        --without-iser-mod)
                            CONFIG_INFINIBAND_ISER=
                        ;;
                        --with-ehca-mod)
                            CONFIG_INFINIBAND_EHCA="m"
                            CONFIG_INFINIBAND_EHCA_SCALING="y"
                        ;;
                        --without-ehca-mod)
                            CONFIG_INFINIBAND_EHCA=
                            CONFIG_INFINIBAND_EHCA_SCALING=
                        ;;
                        --with-rds-mod)
                            CONFIG_INFINIBAND_RDS="m"
                        ;;    
                        --without-rds-mod)
                            CONFIG_INFINIBAND_RDS=
                        ;;
                        --with-rds_debug-mod)
                            CONFIG_INFINIBAND_RDS_DEBUG="y"
                        ;;
                        --without-rds_debug-mod)
                            CONFIG_INFINIBAND_RDS_DEBUG=
                        ;;
                        --with-madeye-mod)
                            CONFIG_INFINIBAND_MADEYE=m
                        ;;
                        --without-madeye-mod)
                            CONFIG_INFINIBAND_MADEYE=
                        ;;
                        --with-modprobe|--without-modprobe)
                        ;;
                        -h | --help)
                                usage
                                exit 0
                        ;;
                        *)
                                echo
                                echo "Wrong parameter $1"
                                echo
                                usage
                                exit 1
                        ;;
                esac
                shift

        done

#Set default values
prefix=${prefix:-"/usr/local"}
PREFIX=${PREFIX:-""}
LIBDIR=${LIBDIR:-""}


KVERSION=${KVERSION:-$(uname -r)}
MIN_KVERSION="2.6.5"
MODULES_DIR=${MODULES_DIR:-/lib/modules/${KVERSION}}
KSRC=${KSRC:-${MODULES_DIR}/build}
WITH_QUILT=${WITH_QUILT:-"yes"}
WITH_PATCH=${WITH_PATCH:-"yes"}
WITH_USERSPACE_FIXES=${WITH_USERSPACE_FIXES:-"yes"}
WITH_KERNEL_FIXES=${WITH_KERNEL_FIXES:-"yes"}

WITH_BACKPORT_PATCHES=${WITH_BACKPORT_PATCHES:-"yes"}
WITH_USERLEVEL=${WITH_USERLEVEL:-"yes"}
ARCH=${ARCH:-$(uname -m)}

case $ARCH in
    i?86|x86_64|ia64)
    WITH_HPAGE_PATCH=${WITH_HPAGE_PATCH:-"yes"}
    ;;
    *)
    WITH_HPAGE_PATCH=${WITH_HPAGE_PATCH:-"no"}
    ;;
esac

# Additional parameters to be passed to configure command
WITH_IBVERBS=${WITH_IBVERBS:-"no"}
WITH_MTHCA=${WITH_MTHCA:-"no"}
WITH_IPATHVERBS=${WITH_IPATHVERBS:-"no"}
WITH_EHCA=${WITH_EHCA:-"no"}
WITH_CM=${WITH_CM:-"no"}
WITH_SDP=${WITH_SDP:-"no"}
WITH_DAPL=${WITH_DAPL:-"no"}
WITH_MANAGEMENT_LIBS=${WITH_MANAGEMENT_LIBS:-"no"}
WITH_OSM=${WITH_OSM:-"no"}
WITH_DIAGS=${WITH_DIAGS:-"no"}
WITH_MPI=${WITH_MPI:-"no"}
WITH_PERFTEST=${WITH_PERFTEST:-"no"}
WITH_SRPTOOLS=${WITH_SRPTOOLS:-"no"}
WITH_IPOIBTOOLS=${WITH_IPOIBTOOLS:-"no"}
WITH_TVFLASH=${WITH_TVFLASH:-"no"}
WITH_MSTFLINT=${WITH_MSTFLINT:-"no"}
WITH_RDMACM=${WITH_RDMACM:-"no"}

WITH_MEMTRACK=${WITH_MEMTRACK:-"no"}

QUILT=${QUILT:-$(/usr/bin/which quilt  2> /dev/null)}
CWD=$(pwd)
CONFIG="configure.mk"
CACHEFILE=${CWD}/configure.cache
PATCH_DIR=${PATCH_DIR:-""}

mkdir -p ${CWD}/include/linux
AUTOCONF_H="${CWD}/include/linux/autoconf.h"

CONFIG_INFINIBAND=${CONFIG_INFINIBAND:-''}
CONFIG_INFINIBAND_IPOIB=${CONFIG_INFINIBAND_IPOIB:-''}
CONFIG_INFINIBAND_SDP=${CONFIG_INFINIBAND_SDP:-''}
CONFIG_INFINIBAND_SRP=${CONFIG_INFINIBAND_SRP:-''}

CONFIG_INFINIBAND_USER_MAD=${CONFIG_INFINIBAND_USER_MAD:-''}
CONFIG_INFINIBAND_USER_ACCESS=${CONFIG_INFINIBAND_USER_ACCESS:-''}
CONFIG_INFINIBAND_ADDR_TRANS=${CONFIG_INFINIBAND_ADDR_TRANS:-''}
CONFIG_INFINIBAND_MTHCA=${CONFIG_INFINIBAND_MTHCA:-''}

CONFIG_INFINIBAND_IPOIB_DEBUG=${CONFIG_INFINIBAND_IPOIB_DEBUG:-''}
CONFIG_INFINIBAND_ISER=${CONFIG_INFINIBAND_ISER:-''}
CONFIG_INFINIBAND_EHCA=${CONFIG_INFINIBAND_EHCA:-''}
CONFIG_INFINIBAND_EHCA_SCALING=${CONFIG_INFINIBAND_EHCA_SCALING:-''}
CONFIG_INFINIBAND_RDS=${CONFIG_INFINIBAND_RDS:-''}
CONFIG_INFINIBAND_RDS_DEBUG=${CONFIG_INFINIBAND_RDS_DEBUG:-''}
CONFIG_INFINIBAND_MADEYE=${CONFIG_INFINIBAND_MADEYE:-''}


CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=${CONFIG_INFINIBAND_IPOIB_DEBUG_DATA:-''}
CONFIG_INFINIBAND_SDP_SEND_ZCOPY=${CONFIG_INFINIBAND_SDP_SEND_ZCOPY:-''}
CONFIG_INFINIBAND_SDP_RECV_ZCOPY=${CONFIG_INFINIBAND_SDP_RECV_ZCOPY:-''}
CONFIG_INFINIBAND_SDP_DEBUG=${CONFIG_INFINIBAND_SDP_DEBUG:-''}
CONFIG_INFINIBAND_SDP_DEBUG_DATA=${CONFIG_INFINIBAND_SDP_DEBUG_DATA:-''}
CONFIG_INFINIBAND_IPATH=${CONFIG_INFINIBAND_IPATH:-''}
CONFIG_INFINIBAND_MTHCA_DEBUG=${CONFIG_INFINIBAND_MTHCA_DEBUG:-''}


#        # Build srptools if SRP module selected
#        if [ "X${CONFIG_INFINIBAND_SRP}" == "Xm" ]; then
#                WITH_SRPTOOLS="yes"             
#        fi

        # Check for minimal supported kernel version
        if ! check_kerver ${KVERSION} ${MIN_KVERSION}; then
                echo "Kernel version ${KVERSION} is less then supported kernel ${MIN_KVERSION}. Exiting..."
                exit 1
        fi

        # Check parameters
        if [ "$WITH_PATCH" == "yes" ] && [ "$WITH_QUILT" == "yes" ] && [[ ! -x ${QUILT} || ! -n "${QUILT}" ]]; then
                echo "Quilt ${QUILT} does not exist... Going to use patch."
                WITH_QUILT="no"
        fi

        # Create configure.mk
        /bin/rm -f ${CWD}/${CONFIG}
        cat >> ${CWD}/${CONFIG} << EOFCONFIG
prefix=${prefix}
PREFIX="${PREFIX}"
libdir=${libdir}

# Current working directory
CWD=${CWD}

# Kernel level
KVERSION=${KVERSION}
EXTRAVERSION=$(echo -n ${KVERSION} | sed 's/^[0-9]\+\.[0-9]\+\.[0-9]\+//')
MODULES_DIR=${MODULES_DIR}
KSRC=${KSRC}

AUTOCONF_H=${AUTOCONF_H}
WITH_MEMTRACK=${WITH_MEMTRACK}

WITH_MAKE_PARAMS=${WITH_MAKE_PARAMS}

CONFIG_INFINIBAND=${CONFIG_INFINIBAND}
CONFIG_INFINIBAND_IPOIB=${CONFIG_INFINIBAND_IPOIB}
CONFIG_INFINIBAND_SDP=${CONFIG_INFINIBAND_SDP}
CONFIG_INFINIBAND_SRP=${CONFIG_INFINIBAND_SRP}

CONFIG_INFINIBAND_USER_MAD=${CONFIG_INFINIBAND_USER_MAD}
CONFIG_INFINIBAND_USER_ACCESS=${CONFIG_INFINIBAND_USER_ACCESS}
CONFIG_INFINIBAND_ADDR_TRANS=${CONFIG_INFINIBAND_ADDR_TRANS}
CONFIG_INFINIBAND_MTHCA=${CONFIG_INFINIBAND_MTHCA}

CONFIG_INFINIBAND_IPOIB_DEBUG=${CONFIG_INFINIBAND_IPOIB_DEBUG}
CONFIG_INFINIBAND_ISER=${CONFIG_INFINIBAND_ISER}
CONFIG_INFINIBAND_EHCA=${CONFIG_INFINIBAND_EHCA}
CONFIG_INFINIBAND_EHCA_SCALING=${CONFIG_INFINIBAND_EHCA_SCALING}
CONFIG_INFINIBAND_RDS=${CONFIG_INFINIBAND_RDS}
CONFIG_INFINIBAND_RDS_DEBUG=${CONFIG_INFINIBAND_RDS_DEBUG}
CONFIG_INFINIBAND_MADEYE=${CONFIG_INFINIBAND_MADEYE}

CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=${CONFIG_INFINIBAND_IPOIB_DEBUG_DATA}
CONFIG_INFINIBAND_SDP_SEND_ZCOPY=${CONFIG_INFINIBAND_SDP_SEND_ZCOPY}
CONFIG_INFINIBAND_SDP_RECV_ZCOPY=${CONFIG_INFINIBAND_SDP_RECV_ZCOPY}
CONFIG_INFINIBAND_SDP_DEBUG=${CONFIG_INFINIBAND_SDP_DEBUG}
CONFIG_INFINIBAND_SDP_DEBUG_DATA=${CONFIG_INFINIBAND_SDP_DEBUG_DATA}
CONFIG_INFINIBAND_IPATH=${CONFIG_INFINIBAND_IPATH}
CONFIG_INFINIBAND_MTHCA_DEBUG=${CONFIG_INFINIBAND_MTHCA_DEBUG}



# User level
WITH_IBVERBS=${WITH_IBVERBS}
WITH_MTHCA=${WITH_MTHCA}
WITH_IPATHVERBS=${WITH_IPATHVERBS}
WITH_EHCA=${WITH_EHCA}
WITH_CM=${WITH_CM}
WITH_SDP=${WITH_SDP}
WITH_DAPL=${WITH_DAPL}
WITH_RDMACM=${WITH_RDMACM}
WITH_MANAGEMENT_LIBS=${WITH_MANAGEMENT_LIBS}
WITH_OSM=${WITH_OSM}
WITH_DIAGS=${WITH_DIAGS}
WITH_MPI=${WITH_MPI}
WITH_PERFTEST=${WITH_PERFTEST}
WITH_SRPTOOLS=${WITH_SRPTOOLS}
WITH_IPOIBTOOLS=${WITH_IPOIBTOOLS}
WITH_TVFLASH=${WITH_TVFLASH}
WITH_MSTFLINT=${WITH_MSTFLINT}

EOFCONFIG
        echo "Created ${CONFIG}:"
        cat ${CWD}/${CONFIG}

# Create autoconf.h
if [ "X${CONFIG_INFINIBAND}" == "Xm" ]; then
        DEFINE_INFINIBAND="#define CONFIG_INFINIBAND 1"
else
        DEFINE_INFINIBAND="#undef CONFIG_INFINIBAND"
fi
if [ "X${CONFIG_INFINIBAND_IPOIB}" == "Xm" ]; then
        DEFINE_INFINIBAND_IPOIB="#define CONFIG_INFINIBAND_IPOIB 1"
else
        DEFINE_INFINIBAND_IPOIB="#undef CONFIG_INFINIBAND_IPOIB"
fi
if [ "X${CONFIG_INFINIBAND_SDP}" == "Xm" ]; then
        DEFINE_INFINIBAND_SDP="#define CONFIG_INFINIBAND_SDP 1"
else
        DEFINE_INFINIBAND_SDP="#undef CONFIG_INFINIBAND_SDP"
fi
if [ "X${CONFIG_INFINIBAND_SRP}" == "Xm" ]; then
        DEFINE_INFINIBAND_SRP="#define CONFIG_INFINIBAND_SRP 1"
else
        DEFINE_INFINIBAND_SRP="#undef CONFIG_INFINIBAND_SRP"
fi
if [ "X${CONFIG_INFINIBAND_USER_MAD}" == "Xm" ]; then
        DEFINE_INFINIBAND_USER_MAD="#define CONFIG_INFINIBAND_USER_MAD 1"
else
        DEFINE_INFINIBAND_USER_MAD="#undef CONFIG_INFINIBAND_USER_MAD"
fi
if [ "X${CONFIG_INFINIBAND_USER_ACCESS}" == "Xm" ]; then
        DEFINE_INFINIBAND_USER_ACCESS="#define CONFIG_INFINIBAND_USER_ACCESS 1"
else
        DEFINE_INFINIBAND_USER_ACCESS="#undef CONFIG_INFINIBAND_USER_ACCESS"
fi
if [ "X${CONFIG_INFINIBAND_ADDR_TRANS}" == "Xy" ]; then
        DEFINE_INFINIBAND_ADDR_TRANS="#define CONFIG_INFINIBAND_ADDR_TRANS 1"
else
        DEFINE_INFINIBAND_ADDR_TRANS="#undef CONFIG_INFINIBAND_ADDR_TRANS"
fi
if [ "X${CONFIG_INFINIBAND_MTHCA}" == "Xm" ]; then
        DEFINE_INFINIBAND_MTHCA="#define CONFIG_INFINIBAND_MTHCA 1"
else
        DEFINE_INFINIBAND_MTHCA="#undef CONFIG_INFINIBAND_MTHCA"
fi
if [ "X${CONFIG_INFINIBAND_IPOIB_DEBUG}" == "Xy" ]; then
        DEFINE_INFINIBAND_IPOIB_DEBUG="#define CONFIG_INFINIBAND_IPOIB_DEBUG 1"
else
        DEFINE_INFINIBAND_IPOIB_DEBUG="#undef CONFIG_INFINIBAND_IPOIB_DEBUG"
fi
if [ "X${CONFIG_INFINIBAND_ISER}" == "Xm" ]; then
        DEFINE_INFINIBAND_ISER="#define CONFIG_INFINIBAND_ISER 1"
else
        DEFINE_INFINIBAND_ISER="#undef CONFIG_INFINIBAND_ISER"
fi
if [ "X${CONFIG_INFINIBAND_EHCA}" == "Xm" ]; then
        DEFINE_INFINIBAND_EHCA="#define CONFIG_INFINIBAND_EHCA 1"
else
        DEFINE_INFINIBAND_EHCA="#undef CONFIG_INFINIBAND_EHCA"
fi
if [ "X${CONFIG_INFINIBAND_EHCA_SCALING}" == "Xy" ]; then
        DEFINE_INFINIBAND_EHCA_SCALING="#define CONFIG_INFINIBAND_EHCA_SCALING 1"
else
        DEFINE_INFINIBAND_EHCA_SCALING="#undef CONFIG_INFINIBAND_EHCA_SCALING"
fi
if [ "X${CONFIG_INFINIBAND_RDS}" == "Xm" ]; then
        DEFINE_INFINIBAND_RDS="#define CONFIG_INFINIBAND_RDS 1"
else
        DEFINE_INFINIBAND_RDS="#undef CONFIG_INFINIBAND_RDS"
fi
if [ "X${CONFIG_INFINIBAND_RDS_DEBUG}" == "Xy" ]; then
        DEFINE_INFINIBAND_RDS_DEBUG="#define CONFIG_INFINIBAND_RDS_DEBUG 1"
else
        DEFINE_INFINIBAND_RDS_DEBUG="#undef CONFIG_INFINIBAND_RDS_DEBUG"
fi
if [ "X${CONFIG_INFINIBAND_MADEYE}" == "Xm" ]; then
        DEFINE_INFINIBAND_MADEYE="#define CONFIG_INFINIBAND_MADEYE 1"
else
        DEFINE_INFINIBAND_MADEYE="#undef CONFIG_INFINIBAND_MADEYE"
fi
if [ "X${CONFIG_INFINIBAND_IPOIB_DEBUG_DATA}" == "Xy" ]; then
        DEFINE_INFINIBAND_IPOIB_DEBUG_DATA="#define CONFIG_INFINIBAND_IPOIB_DEBUG_DATA 1"
else
        DEFINE_INFINIBAND_IPOIB_DEBUG_DATA="#undef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA"
fi
if [ "X${CONFIG_INFINIBAND_SDP_SEND_ZCOPY}" == "Xy" ]; then
        DEFINE_INFINIBAND_SDP_SEND_ZCOPY="#define CONFIG_INFINIBAND_SDP_SEND_ZCOPY 1"
else
        DEFINE_INFINIBAND_SDP_SEND_ZCOPY="#undef CONFIG_INFINIBAND_SDP_SEND_ZCOPY"
fi
if [ "X${CONFIG_INFINIBAND_SDP_RECV_ZCOPY}" == "Xy" ]; then
        DEFINE_INFINIBAND_SDP_RECV_ZCOPY="#define CONFIG_INFINIBAND_SDP_RECV_ZCOPY 1"
else
        DEFINE_INFINIBAND_SDP_RECV_ZCOPY="#undef CONFIG_INFINIBAND_SDP_RECV_ZCOPY"
fi
if [ "X${CONFIG_INFINIBAND_SDP_DEBUG}" == "Xy" ]; then
        DEFINE_INFINIBAND_SDP_DEBUG="#define CONFIG_INFINIBAND_SDP_DEBUG 1"
else
        DEFINE_INFINIBAND_SDP_DEBUG="#undef CONFIG_INFINIBAND_SDP_DEBUG"
fi
if [ "X${CONFIG_INFINIBAND_SDP_DEBUG_DATA}" == "Xy" ]; then
        DEFINE_INFINIBAND_SDP_DEBUG_DATA="#define CONFIG_INFINIBAND_SDP_DEBUG_DATA 1"
else
        DEFINE_INFINIBAND_SDP_DEBUG_DATA="#undef CONFIG_INFINIBAND_SDP_DEBUG_DATA"
fi
if [ "X${CONFIG_INFINIBAND_IPATH}" == "Xm" ]; then
        DEFINE_INFINIBAND_IPATH="#define CONFIG_INFINIBAND_IPATH 1"
else
        DEFINE_INFINIBAND_IPATH="#undef CONFIG_INFINIBAND_IPATH"
fi
if [ "X${CONFIG_INFINIBAND_MTHCA_DEBUG}" == "Xy" ]; then
        DEFINE_INFINIBAND_MTHCA_DEBUG="#define CONFIG_INFINIBAND_MTHCA_DEBUG 1"
else
        DEFINE_INFINIBAND_MTHCA_DEBUG="#undef CONFIG_INFINIBAND_MTHCA_DEBUG"
fi


cat >> ${AUTOCONF_H} << EOFAUTOCONF
#undef CONFIG_INFINIBAND
#undef CONFIG_INFINIBAND_IPOIB
#undef CONFIG_INFINIBAND_SDP
#undef CONFIG_INFINIBAND_SRP

#undef CONFIG_INFINIBAND_USER_MAD
#undef CONFIG_INFINIBAND_USER_ACCESS
#undef CONFIG_INFINIBAND_ADDR_TRANS
#undef CONFIG_INFINIBAND_MTHCA

#undef CONFIG_INFINIBAND_IPOIB_DEBUG
#undef CONFIG_INFINIBAND_ISER
#undef CONFIG_INFINIBAND_EHCA
#undef CONFIG_INFINIBAND_EHCA_SCALING
#undef CONFIG_INFINIBAND_RDS
#undef CONFIG_INFINIBAND_RDS_DEBUG
#undef CONFIG_INFINIBAND_MADEYE

#undef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA
#undef CONFIG_INFINIBAND_SDP_SEND_ZCOPY
#undef CONFIG_INFINIBAND_SDP_RECV_ZCOPY
#undef CONFIG_INFINIBAND_SDP_DEBUG
#undef CONFIG_INFINIBAND_SDP_DEBUG_DATA
#undef CONFIG_INFINIBAND_IPATH
#undef CONFIG_INFINIBAND_MTHCA_DEBUG

${DEFINE_INFINIBAND}
${DEFINE_INFINIBAND_IPOIB}
${DEFINE_INFINIBAND_SDP}
${DEFINE_INFINIBAND_SRP}

${DEFINE_INFINIBAND_USER_MAD}
${DEFINE_INFINIBAND_USER_ACCESS}
${DEFINE_INFINIBAND_ADDR_TRANS}
${DEFINE_INFINIBAND_MTHCA}

${DEFINE_INFINIBAND_IPOIB_DEBUG}
${DEFINE_INFINIBAND_ISER}
${DEFINE_INFINIBAND_EHCA}
${DEFINE_INFINIBAND_RDS}
${DEFINE_INFINIBAND_RDS_DEBUG}


${DEFINE_INFINIBAND_IPOIB_DEBUG_DATA}
${DEFINE_INFINIBAND_SDP_SEND_ZCOPY}
${DEFINE_INFINIBAND_SDP_RECV_ZCOPY}
${DEFINE_INFINIBAND_SDP_DEBUG}
${DEFINE_INFINIBAND_SDP_DEBUG_DATA}
${DEFINE_INFINIBAND_IPATH}
${DEFINE_INFINIBAND_MTHCA_DEBUG}
${DEFINE_INFINIBAND_MADEYE}

EOFAUTOCONF

        echo "Created ${AUTOCONF_H}:"
        cat ${AUTOCONF_H}

        if [ "$WITH_PATCH" == "yes" ]; then
                apply_patch
        fi

        if [ "$WITH_USERLEVEL" == "yes" ]; then
                # Run configure for user level
        
                ullibs="examples" ## useraccess-lib
        
                if [ "${WITH_IBVERBS}" == "yes" ]; then
                    ullibs="${ullibs} libibverbs"
                fi
                if [ "${WITH_MTHCA}" == "yes" ]; then
                    ullibs="${ullibs} libmthca"
                fi
                if [ "${WITH_IPATHVERBS}" == "yes" ]; then
                    ullibs="${ullibs} libipathverbs"
                fi
                if [ "${WITH_EHCA}" == "yes" ]; then
                    ullibs="${ullibs} libehca"
                fi
                if [ "${WITH_CM}" == "yes" ]; then
                    ullibs="${ullibs} libibcm"
                fi
                if [ "${WITH_SDP}" == "yes" ]; then
                    ullibs="${ullibs} libsdp"
                fi
                if [ "${WITH_DAPL}" == "yes" ]; then
                    ullibs="${ullibs} dapl"
                fi
                if [ "${WITH_MSTFLINT}" == "yes" ]; then
                    ullibs="${ullibs} mstflint"
                fi
                if [ "${WITH_PERFTEST}" == "yes" ]; then
                    ullibs="${ullibs} perftest"
                fi
                if [ "${WITH_SRPTOOLS}" == "yes" ]; then
                    ullibs="${ullibs} srptools"
                fi
                if [ "${WITH_TVFLASH}" == "yes" ]; then
                    ullibs="${ullibs} tvflash"
                fi
                if [ "${WITH_RDMACM}" == "yes" ]; then
                    ullibs="${ullibs} librdmacm"
                fi
                if [ "${WITH_DAPL}" == "yes" ]; then
                    ullibs="${ullibs} dapl"
                fi
                
                ex /bin/rm -f ${CACHEFILE}

                for dir in ${ullibs}
                do
                        ex cd ${CWD}/src/userspace/${dir}
#                       # W/A till autotools will be ready for dapl
#                        case ${dir} in
#                                dapl)
#                                continue
#                                ;;
#                        esac
                        
                        [ ! -x ./configure ] && [ ! -x ./autogen.sh ] && continue
                        [ ! -x ./configure ] && ./autogen.sh 
        
                        echo "Running: ./configure --cache-file=${CACHEFILE} --disable-libcheck ${PREFIX} ${LIBDIR} CPPFLAGS=\"-I../libibverbs/include\""
                        
                        if ! ( ./configure --cache-file=${CACHEFILE} --disable-libcheck ${PREFIX} ${LIBDIR} \
                                CPPFLAGS="-I../libibverbs/include" )
                        then
                                echo "Failed to execute: ./configure --cache-file=${CACHEFILE} --disable-libcheck ${PREFIX} ${LIBDIR} CPPFLAGS=\"-I../libibverbs/include\""
                                exit 1
                        fi
                done
        
                ex /bin/rm -f ${CACHEFILE}
                
                if [ "${WITH_MANAGEMENT_LIBS}" == "yes" ]; then                                            
                        ex cd ${CWD}/src/userspace/management
                        manage_dirs="libibcommon libibumad libibmad"
                        
                        if [ "${WITH_OSM}" == "yes" ]; then
                            manage_dirs="${manage_dirs} osm"
                        fi
        
                        if [ "${WITH_DIAGS}" == "yes" ]; then
                                manage_dirs="${manage_dirs} diags"
                        fi
        
                        for dir in ${manage_dirs}
                        do
                                ( cd ${dir} &&
                                        [ ! -x ./configure ] && [ ! -x ./autogen.sh ] ) && continue
                                ( cd ${dir} && 
                                        [ ! -x ./configure ] && ./autogen.sh )
                                echo "Running: cd ${dir} && ./configure --cache-file=${CACHEFILE} --disable-libcheck ${PREFIX} ${LIBDIR}"
                                if ! ( cd ${dir} && ./configure --cache-file=${CACHEFILE} --disable-libcheck ${PREFIX} ${LIBDIR})
                                then
                                        echo "Failed to execute ./configure --cache-file=${CACHEFILE} --disable-libcheck ${PREFIX} ${LIBDIR}"
                                        exit 1
                                fi            
                        done
                        ex /bin/rm -f ${CACHEFILE}
                fi                
        fi
}

main $@
